package array;

/**
 * @Author wangtengyu
 * @Create 2018-09-11-13:47
 * <p>
 * 给定一个数组，数组排列后，奇数在前，偶数在后 排序后是奇数在左，偶数在右
 * <p>
 * 和快速排序异曲同工,都是一左一右两个指针互相交换
 *
 *
 * 进阶的思考： 如果说是把数分为负数在前，非负数在后呢。 如果说是把数分为小于5的在前，大于5的在后呢。
 *
 * 一个方法是拆分成前后两段的方法 一个方法是拆分的规则
 */
public class OddAndEven {

  public void reorder(int[] array, int left, int right) {
    if (array == null || array.length <= 0) {
      return;
    }
    int begin = left;
    int end = right;
    while (true) {
      while (begin <= right && !isEven(array[begin])) {
        begin++;
      }
      while (end >= left && isEven(array[end])) {
        end--;
      }
      if (begin > end) {
        break;
      }
      int temp = array[begin];
      array[begin] = array[end];
      array[end] = temp;
    }
  }


  //定义重新排序的规则，规则返回的是boolean型  奇数在前偶数在后
  public boolean isEven(int num) {
    return num % 2 == 0;
  }

  //是否正数，负数在前，正数在后
  public boolean isPositive(int num) {
    return num > 0;
  }


  public static void main(String[] args) {
    OddAndEven oddAndEven = new OddAndEven();
    int[] array = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
//        int [] array=new int[]{1,-1,2,-2,3,-4,5,-5};
    oddAndEven.reorder(array, 0, array.length - 1);

    for (int i = 0; i < array.length; i++) {
      System.out.print(array[i] + " ");
    }
  }


}
